import java.io.*;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.*;

public class Metodos {

	ArrayList<Employee> lista = new ArrayList<Employee>();
	File fileInUse;

	public File getFileInUse() {
		return fileInUse;
	}

	public void setFileInUse(File fileInUse) {
		this.fileInUse = fileInUse;
	}

	public ArrayList<Employee> getLista() {
		return lista;
	}

	public void setLista(ArrayList<Employee> lista) {
		this.lista = lista;
	}

	/**
	 * Metodo para almacenar la lista de empleados contenidos en un archivo .DAT
	 * 
	 * @param file
	 *            archivo a examinar
	 */
	public void cargarListaEmpleados(File file) {
		this.fileInUse = file;
		FileInputStream fileIn = null;
		ObjectInputStream objIn = null;
		Employee aux = null;
		try {
			fileIn = new FileInputStream(file);
			objIn = new ObjectInputStream(fileIn);
			try {
				while (true) {
					aux = (Employee) objIn.readObject();
					this.lista.add(aux);
				}
			} catch (EOFException e) {
				System.out.println("fin de fichero1");
			}

		} catch (ClassNotFoundException e) {
			System.out.println("no encuentro la clase" + e.toString());

		} catch (IOException e) {
			System.out.println("error io");
		} finally {
			try {
				objIn.close();
			} catch (IOException e) {
			}
		}

	}

	/**
	 * metodo para buscar un empleado dentro de un archivo
	 * 
	 * @param x
	 *            id del empleado el cual vamos a buscar
	 * @return devuelve el empleado en caso de encontrarlo, de no ser asi
	 *         devuelve un null
	 */
	public Employee buscarEmpleado(int x) {
		Employee aux = null;
		for (int i = 0; i < this.lista.size(); i++) {
			aux = (Employee) lista.get(i);
			int numero = aux.getEmp_no();
			if (numero == x)
				System.out.println(aux);
			return aux;
		}
		return aux;
	}

	/**
	 * metodo para crear un archivo
	 * 
	 * @param file
	 *            archivo con la ruta deseada para crear
	 */
	public void crearArchivo(File file) {
		try {
			file.createNewFile();
		} catch (IOException e) {
			System.out.println("Fichero no creado");
		}
	}

	/**
	 * metodo para escribir objetos Empleado dentro de un archivo
	 * 
	 * @param file
	 *            archivo donde se escribiran los objetos
	 * @param array
	 *            array que contiene los objetos los cuales seran escritos en el
	 *            archivo
	 */
	public void escribirEmpleados(File file, ArrayList<Employee> array) {
		FileOutputStream fileOut = null;
		ObjectOutputStream objOut = null;
		try {
			fileOut = new FileOutputStream(file);
			objOut = new ObjectOutputStream(fileOut);
			for (Employee i : array) {
				objOut.writeObject(i);
			}
			objOut.close();
		} catch (IOException e) {
			System.out.println("No se pudo crear el lector");
		}
	}

	/**
	 * metodo para mostrar empleados de un archivo
	 * 
	 * @param file
	 *            archivo de el cual se van a extraer los objetos Empleado para
	 *            mostrar
	 */
	public void mostrarEmpleado(int x) {
		for (int i = 0; i < this.lista.size(); i++) {
			Employee aux = (Employee) lista.get(i);
			int numero = aux.getEmp_no();
			if (numero == x)
				System.out.println(aux);
		}
	}

	/**
	 * metodo para modificar el salario de un empleado dentro de un archivo
	 * 
	 * @param id
	 *            id del empleado el cual vamos a modificar el salario
	 * @param salario
	 *            nuevo salario a ingresar en el empleado
	 * @param file
	 *            archivo en el cual se buscara el empleado por id para
	 *            modificar su sueldo
	 */
	public void cambiarSalario(int id, int salario) {
		Employee aux = this.buscarEmpleado(id);
		if (aux != null) {
			System.out.println("Salario antiguo: " + aux.getSalary()
					+ "\n Salario nuevo: " + salario);
			aux.setSalary(salario);
			this.guardarDatos();
		}
	}

	/**
	 * Metodo para eliminar empleado de la lista de el archivo que se esta
	 * utilizando
	 * 
	 * @param x
	 *            Id de el Empleado a eliminar
	 */
	public void eliminarEmpleado(int x) {
		Employee aux = this.buscarEmpleado(x);
		if (aux != null) {
			this.lista.remove(aux);
			this.guardarDatos();
		} else {
			System.out.println("empleado no encontrado =) , Despide a otro ");
		}
	}

	/**
	 * Metodo para guardar los cambios realizados en el fichero que se esta
	 * utilizando en este momento
	 */
	public void guardarDatos() {
		File fileAux = new File(this.fileInUse.getAbsolutePath());
		FileOutputStream fileOut;
		ObjectOutputStream objectOut = null;
		try {
			fileOut = new FileOutputStream(fileAux);
			objectOut = new ObjectOutputStream(fileOut);
		} catch (FileNotFoundException e) {
		} catch (IOException er) {
		}
		for (int i = 0; i < this.lista.size(); i++) {
			Employee empleadoAuxiliar = (Employee) this.lista.get(i);
			try {
				objectOut.writeObject(empleadoAuxiliar);
			} catch (IOException e) {
			}
		}

		this.fileInUse.delete();
		try {
			fileAux.createNewFile();
			this.setFileInUse(fileAux);
			System.out.println("...Cambios realizados correctamente...");
		} catch (IOException e) {
		}

	}
}
